package org.xurui.bsj.protocol.command.impl;

import org.hswebframework.web.bean.FastBeanCopier;
import org.jetlinks.core.message.DeviceMessage;
import org.jetlinks.core.message.codec.FromDeviceMessageContext;
import org.jetlinks.core.message.event.EventMessage;
import org.xurui.bsj.protocol.command.CmdCodec;
import org.xurui.bsj.protocol.enums.CommandEnum;
import org.xurui.bsj.protocol.msg.BsjMessage;
import org.xurui.bsj.protocol.utils.ArrayUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 4.1.2 缺电报警、关机报警
 */
public class CmdCodec_ALARM_POWER  implements CmdCodec {
    @Override
    public boolean supportsCmd(String cmd) {
        return CommandEnum.ALARM_POWER.name().equals(cmd);
    }

    @Override
    public List<DeviceMessage> parsePayload(BsjMessage payload, FromDeviceMessageContext context) {
        //例子：[867082058798193,89860000192027575560,202106302223360005,ALARM_POWER,3,20210630222336,5,4@11%]
        /**
         * 报文体格式： 上报类型@剩余电量
         * 字段说明：   1.上报类型(1=缺电报警; 2=关机报警; 3=自动关机报警; 4=开机报警,5=设备充电，6=电 源已断开 7=设备电量已充满)
         *            2. 剩余电量
         *            缺电报警取值：1@10% 意思是当终端电量低于 10%，会发送报告给业 务平台，该值由终端自行决定。
         *            关机报警取值：2@
         *            自动关机报警取值：3@5% 意思是当终端电量低于 5%，会发送报告给业 务平台，并自动关机，该值由终端自行决定。
         *            开机报警取值:4@
         *            设备充电:5@
         *            电源已断开: 6@
         *            电量已充满: 7@100%
         */
        //设备上报事件
        EventMessage eventMessage = new EventMessage();
        eventMessage.setDeviceId(payload.getHeader().getDeviceNo());
        eventMessage.setEvent(payload.getHeader().getCmd());
        eventMessage.setMessageId(payload.getHeader().getOrderNo());
        eventMessage.setTimestamp(System.currentTimeMillis());
        Map<String, Object> properties = new HashMap<>();
        String tempBody = payload.getTempBody();
        String[] tempBodyArr = tempBody.split("@");
        //properties.put("header", FastBeanCopier.copy(payload.getHeader(), HashMap::new));
        properties.put("header", payload.getHeader().toMap());

        /**
         * 上报类型(1=缺电报警; 2=关机报警; 3=自动关机报警; 4=开机报警,5=设备充电，6=电 源已断开 7=设备电量已充满)
         */
        properties.put("reportType", ArrayUtils.getStrByIndex(tempBodyArr,0));
        /**
         剩余电量
         *            缺电报警取值：1@10% 意思是当终端电量低于 10%，会发送报告给业 务平台，该值由终端自行决定。
         *            关机报警取值：2@
         *            自动关机报警取值：3@5% 意思是当终端电量低于 5%，会发送报告给业 务平台，并自动关机，该值由终端自行决定。
         *            开机报警取值:4@
         *            设备充电:5@
         *            电源已断开: 6@
         *            电量已充满: 7@100%
         */
        /*String bat="";
        if(tempBodyArr.length>1){
            bat=tempBodyArr[1];
        }*/
        properties.put("bat",ArrayUtils.getStrByIndex(tempBodyArr,1));
        eventMessage.setData(properties);

        //回复消息
        //标识通信方向，取值如下: 1.下发请求 2.下发响应 3.上报请求 4.上报响应
        //说明：平台下发请求标示 1，则终 端响应标示为 2，终端上报接口标 示为 3，平台响应标示为 4
        //组装需要回复设备消息提
        /**
         * 报文体格式： 应答状态（0＝正常，1＝非平台用户，2＝其他异常）
         */
        //示例：[35380100360174,898600MFSSYYGXXXXXXP,201805082000001000,ALARM_POWER,4, 20180528111820,1,0]
        payload.setTempReplyBody("0");
        return genDeviceMessage(eventMessage);
    }
}
